今天要介紹的逃逸手法是透過 cgroups 的機制來觸發達到目的,但在使用該機制前我們來先了解一下 cgroups 大概是幹嘛的。
cgroups 是可以針對將多個Process組成集合,並且以這些集合為單位,限制該集合中夠使用的總資源上限,藉此避免需被隔離的Process使用系統過多的資源。cgroups 也有可以限制資源的類型,包含了cpu、cpuacct、cpuset、memory、devices、freezer、net_cls、blkio、perf_event、net_prio、hugetlb、pids、rdma。
這邊就以最直覺的 cpu 做為測試範例,參考使用 cgroups-v1 为应用程序设置 CPU 限制。 先參考 Day19 - 當容器逃逸的生活遇到瓶頸時,知道該怎麼做嗎?繼續用 unshare 就對了。 將 cgroups 版本切換到 v1。
先新增一個無窮迴圈的檔案,並且執行它。
cat << EOF > loop.c
int main(void) {
int i=0 ;
for( ; ; ) i++ ;
return 0;
}
EOF
sudo apt update && sudo apt install -y gcc ;
gcc loop.c ;
./a.out ;
#開另個 Terminal 看一下 CPU 使用量,不出意外有顆 CPU 的使用率會特別高
htop ;
# 確認是否已掛載了 cgroups 控制器
mount -l | grep cgroup ;
sudo mkdir -p /sys/fs/cgroup/cpu/my_limit/ ;
# 發現只是建個資料夾產生一大堆檔案
ll /sys/fs/cgroup/cpu/my_limit/ ;
#這邊要用 root 權限做
echo "1000000" > /sys/fs/cgroup/cpu/my_limit/cpu.cfs_period_us ;
echo "200000" > /sys/fs/cgroup/cpu/my_limit/cpu.cfs_quota_us ;
#執行 ./a.out 程式,才會有 pid
./a.out ;
#查一下 a.out 的 pid 是多少
ps aux | grep a.out | grep -v grep ;
#把這個 pid 加到 cgroup 的群組裡面
echo "pid" > /sys/fs/cgroup/cpu/my_limit/cgroup.procs ;
# 觀察一下 CPU 使用量,大概會坐落在 20% 左右
htop ;
比較難的部分設定 cfs_period_us、cfs_quota_us 的地方,參考3.2. cpu 的說明如下。
cpu.cfs_period_us
大概知道 cgroups 的作用之後,cgroups 逃逸手法部分就參考 Day19 - 當容器逃逸的生活遇到瓶頸時,知道該怎麼做嗎?繼續用 unshare 就對了。。
參考資料 :
今日總結 :